/*
 *  Copyright 2006 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.mybatis.generator.internal.rules;

import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;

/**
 * This interface centralizes all the rules related to code generation - including the methods and objects to create,
 * and certain attributes related to those objects.
 * 
 * @author Jeff Butler
 */
public interface Rules
{
    
    /**
     * Implements the rule for generating the insert SQL Map element and DAO method. If the insert statement is allowed,
     * then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateInsert();
    
    /**
     * Implements the rule for generating the insert selective SQL Map element and DAO method. If the insert statement
     * is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateInsertSelective();
    
    /**
     * Calculates the class that contains all fields. This class is used as the insert statement parameter, as well as
     * the returned value from the select by primary key method. The actual class depends on how the domain model is
     * generated.
     * 
     * @return the type of the class that holds all fields
     */
    FullyQualifiedJavaType calculateAllFieldsClass();
    
    /**
     * Implements the rule for generating the update by primary key without BLOBs SQL Map element and DAO method. If the
     * table has a primary key as well as other non-BLOB fields, and the updateByPrimaryKey statement is allowed, then
     * generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateUpdateByPrimaryKeyWithoutBLOBs();
    
    /**
     * Implements the rule for generating the update by primary key with BLOBs SQL Map element and DAO method. If the
     * table has a primary key as well as other BLOB fields, and the updateByPrimaryKey statement is allowed, then
     * generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateUpdateByPrimaryKeyWithBLOBs();
    
    /**
     * Implements the rule for generating the update by primary key selective SQL Map element and DAO method. If the
     * table has a primary key as well as other fields, and the updateByPrimaryKey statement is allowed, then generate
     * the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateUpdateByPrimaryKeySelective();
    
    /**
     * Implements the rule for generating the delete by primary key SQL Map element and DAO method. If the table has a
     * primary key, and the deleteByPrimaryKey statement is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateDeleteByPrimaryKey();
    
    /**
     * Implements the rule for generating the delete by example SQL Map element and DAO method. If the deleteByExample
     * statement is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateDeleteByExample();
    
    /**
     * Implements the rule for generating the result map without BLOBs. If either select method is allowed, then
     * generate the result map.
     * 
     * @return true if the result map should be generated
     */
    boolean generateBaseResultMap();
    
    /**
     * Implements the rule for generating the result map with BLOBs. If the table has BLOB columns, and either select
     * method is allowed, then generate the result map.
     * 
     * @return true if the result map should be generated
     */
    boolean generateResultMapWithBLOBs();
    
    /**
     * Implements the rule for generating the SQL example where clause element.
     * 
     * In iBATIS2, generate the element if the selectByExample, deleteByExample, updateByExample, or countByExample
     * statements are allowed.
     * 
     * In MyBatis3, generate the element if the selectByExample, deleteByExample, or countByExample statements are
     * allowed.
     * 
     * @return true if the SQL where clause element should be generated
     */
    boolean generateSQLExampleWhereClause();
    
    /**
     * Implements the rule for generating the SQL example where clause element specifically for use in the update by
     * example methods.
     * 
     * In iBATIS2, do not generate the element.
     * 
     * In MyBatis, generate the element if the updateByExample statements are allowed.
     * 
     * @return true if the SQL where clause element should be generated
     */
    boolean generateMyBatis3UpdateByExampleWhereClause();
    
    /**
     * Implements the rule for generating the SQL base column list element. Generate the element if any of the select
     * methods are enabled.
     * 
     * @return true if the SQL base column list element should be generated
     */
    boolean generateBaseColumnList();
    
    /**
     * Implements the rule for generating the SQL blob column list element. Generate the element if any of the select
     * methods are enabled, and the table contains BLOB columns.
     * 
     * @return true if the SQL blob column list element should be generated
     */
    boolean generateBlobColumnList();
    
    /**
     * Implements the rule for generating the select by primary key SQL Map element and DAO method. If the table has a
     * primary key as well as other fields, and the selectByPrimaryKey statement is allowed, then generate the element
     * and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateSelectByPrimaryKey();
    
    /**
     * Implements the rule for generating the select by example without BLOBs SQL Map element and DAO method. If the
     * selectByExample statement is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateSelectByExampleWithoutBLOBs();
    
    /**
     * Implements the rule for generating the select by example with BLOBs SQL Map element and DAO method. If the table
     * has BLOB fields and the selectByExample statement is allowed, then generate the element and method.
     * 
     * @return true if the element and method should be generated
     */
    boolean generateSelectByExampleWithBLOBs();
    
    /**
     * Implements the rule for generating an example class. The class should be generated if the selectByExample or
     * deleteByExample or countByExample methods are allowed.
     * 
     * @return true if the example class should be generated
     */
    boolean generateExampleClass();
    
    boolean generateCountByExample();
    
    boolean generateUpdateByExampleSelective();
    
    boolean generateUpdateByExampleWithoutBLOBs();
    
    boolean generateUpdateByExampleWithBLOBs();
    
    /**
     * Implements the rule for determining whether to generate a primary key class. If you return false from this
     * method, and the table has primary key columns, then the primary key columns will be added to the base class.
     * 
     * @return true if a separate primary key class should be generated
     */
    boolean generatePrimaryKeyClass();
    
    /**
     * Implements the rule for generating a base record.
     * 
     * @return true if the class should be generated
     */
    boolean generateBaseRecordClass();
    
    /**
     * Implements the rule for generating a record with BLOBs. If you return false from this method, and the table had
     * BLOB columns, then the BLOB columns will be added to the base class.
     * 
     * @return true if the record with BLOBs class should be generated
     */
    boolean generateRecordWithBLOBsClass();
    
    /**
     * Implements the rule for generating a Java client. This rule is only active when a javaClientGenerator
     * configuration has been specified, but the table is designated as "modelOnly". Do not generate the client if the
     * table is designated as modelOnly.
     * 
     * @return true if the Java client should be generated
     */
    boolean generateJavaClient();
    
    IntrospectedTable getIntrospectedTable();
}
